﻿///*
// * Block
// * 
// * Copyright (c) Adam Sida, asida@centrum.cz
// * 
// * All rights reserved.
// */
//using System;



//namespace Petra.Gis.Geometry.Image.Tiff
//{

//  /// <summary>
//  /// Block represents a bit more universal representation of tiff image stripe or tile data
//  /// by using this class program makes no difference between tiles or stripes
//  /// </summary>
//  public class Block //tiff tile or stripe
//  {

//    TiffBitmapSource _image;
//    int _blockIndex;

//    #region constructors

//    /// <summary>
//    /// helper object for either stripe or tile, manages basic properties
//    /// </summary>
//    /// <param name="image">parent image</param>
//    /// <param name="blockIndex">index of stripe or tile (zero based)</param>
//    public Block(TiffBitmapSource image, int blockIndex)
//    {
//      if (image == null || blockIndex < 0)
//        throw new ArgumentException("null image or invalid tile number");

//      if (blockIndex >= image.TiffMetadata.NumBlocks)
//        throw new ArgumentException("Not a valid block index: " + _blockIndex);

//      _image = image;
//      _blockIndex = blockIndex;
//    }

//    #endregion constructors


//    /// <summary>
//    /// returns parent TiffBitmapSource / page of this block (tile or stripe)
//    /// </summary>
//    public TiffBitmapSource Image
//    {
//      get { return _image; }
//    }



//    /// <summary>
//    /// returns tiff file offset of current tile or stripe
//    /// </summary>
//    public long Offset //tile data offset in tiff file
//    {
//      get 
//      {
//        if (_image.TiffMetadata.IsTiled)
//          return System.Convert.ToInt64(_image.TiffMetadata.Ifd.GetTag(Tag.TagId.TILEOFFSETS).TagData[_blockIndex]); 
//        else
//          return System.Convert.ToInt64(_image.TiffMetadata.Ifd.GetTag(Tag.TagId.STRIPOFFSETS).TagData[_blockIndex]);
//      }
//    }



//    /// <summary>
//    /// returns (compressed) size of current stripe or tile in bytes
//    /// </summary>
//    public int CompressedSize
//    {
//      get 
//      {
//        if (_image.TiffMetadata.IsTiled)
//          return System.Convert.ToInt32(_image.TiffMetadata.Ifd.GetTag(Tag.TagId.TILEBYTECOUNTS).TagData[_blockIndex]);
//        else
//          return System.Convert.ToInt32(_image.TiffMetadata.Ifd.GetTag(Tag.TagId.STRIPBYTECOUNTS).TagData[_blockIndex]);
//      }
//    }


//    /// <summary>
//    /// returns left bound column index of current block (zero based)
//    /// </summary>
//    public int BlockX1
//    {
//      get 
//      {
//        if (_image.TiffMetadata.IsTiled)
//          return (_blockIndex % _image.TiffMetadata.NumOfHorizontalBlocks) * _image.TiffMetadata.BlockWidth;
//        else
//          return 0;
//      }
//    }



//    /// <summary>
//    /// returns right bound column index of current block (zero based)
//    /// </summary>
//    public int BlockX2
//    {
//      get 
//      {
//        if (_image.TiffMetadata.IsTiled)
//        {
//          int result = ((_blockIndex % _image.TiffMetadata.NumOfHorizontalBlocks) + 1) * _image.TiffMetadata.BlockWidth - 1;
//          if (result >= _image.Width)
//          {
//            result = _image.PixelWidth - 1;
//          }
//          return result;

//        }
//        else
//          return _image.PixelWidth - 1;
//      }
//    }



//    /// <summary>
//    /// returns top bound row index of current block (zero based)
//    /// </summary>
//    public int BlockY1
//    {
//      get
//      {
//        if (_image.TiffMetadata.IsTiled)
//          return (((int)(_blockIndex / _image.TiffMetadata.NumOfHorizontalBlocks)) % _image.TiffMetadata.NumOfVerticalBlocks) * _image.TiffMetadata.BlockHeight;
//        else
//          return (_blockIndex % _image.TiffMetadata.NumOfStrips) * _image.TiffMetadata.BlockHeight;
//      }
//    }



//    /// <summary>
//    /// returns bottom bound row index of current block (zero based)
//    /// </summary>
//    public int BlockY2
//    {
//      get
//      {
//        if (_image.TiffMetadata.IsTiled)
//        {
//          int result = ((((int)(_blockIndex / _image.TiffMetadata.NumOfHorizontalBlocks)) % _image.TiffMetadata.NumOfVerticalBlocks) + 1) * _image.TiffMetadata.BlockHeight - 1;
//          if (result >= _image.PixelHeight)
//          {
//            result = _image.PixelHeight - 1;
//          }
//          return result;
//        }
//        else 
//        {
//          int result = ((_blockIndex % _image.TiffMetadata.NumOfStrips) + 1) * _image.TiffMetadata.BlockHeight - 1;
//          if (result >= _image.PixelHeight)
//          {
//            result = _image.PixelHeight - 1;
//          }
//          return result;
//        }
//      }
//    }




//    /// <summary>
//    /// height of current block (stripe or tile)
//    /// </summary>
//    public int Height
//    {
//      get
//      {
//        return this.BlockY2 - this.BlockY1 + 1;
//      }
//    }




//    /// <summary>
//    /// width of current block (stripe or tile)
//    /// </summary>
//    public int Width
//    {
//      get 
//      {
//        return this.BlockX2 - this.BlockX1 + 1;

//      }
//    }

//  }
//}
